package com.c2b.algorithm.leetcode.base;

/**
 * <a href='https://leetcode.cn/problems/find-the-town-judge/'>找到小镇的法官(Find the Town Judge)</a>
 * <p>小镇里有 n 个人，按从 1 到 n 的顺序编号。传言称，这些人中有一个暗地里是小镇法官。</p>
 * <p>
 * 如果小镇法官真的存在，那么：
 *     <ol>
 *         <li>小镇法官不会信任任何人。</li>
 *         <li>每个人（除了小镇法官）都信任这位小镇法官。</li>
 *         <li>只有一个人同时满足属性 1 和属性 2 。</li>
 *     </ol>
 * </p>
 * <p>给你一个数组 trust ，其中 trust[i] = [ai, bi] 表示编号为 ai 的人信任编号为 bi 的人。</p>
 * <p>如果小镇法官存在并且可以确定他的身份，请返回该法官的编号；否则，返回 -1 。</p>
 *
 * <p>
 * <b>示例：</b>
 * <pre>
 * 示例 1：
 *      输入：n = 2, trust = [[1,2]]
 *      输出：2
 *
 * 示例 2：
 *      输入：n = 3, trust = [[1,3],[2,3]]
 *      输出：3
 *
 * 示例 3：
 *      输入：n = 3, trust = [[1,3],[2,3],[3,1]]
 *      输出：-1
 * </pre>
 * </p>
 *
 * <p>
 * <b>提示：</b>
 *     <ul>
 *         <li>1 <= n <= 1000</li>
 *         <li>0 <= trust.length <= 10^4</li>
 *         <li>trust[i].length == 2</li>
 *         <li>trust 中的所有trust[i] = [ai, bi] 互不相同</li>
 *         <li>ai != bi</li>
 *         <li>1 <= ai, bi <= n</li>
 *     </ul>
 * </p>
 *
 * @author c2b
 * @since 2023/12/19 15:13
 */
public class LC0997FindTheTownJudge_S {

    static class Solution {
        public int findJudge(int n, int[][] trust) {
            if (trust.length == 0) {
                if (n == 1) {
                    return 1;
                } else {
                    return -1;
                }
            }
            // 会出现一个人信任多个人的情况。所以统计每个人被信任的次数，和当前人信任的人的集合
            // in : 当前人被多少人信任。out：当前人信任多少人
            int[] in = new int[n + 1];
            int[] out = new int[n + 1];
            for (int[] ints : trust) {
                out[ints[0]]++;
                in[ints[1]]++;
            }
            for (int i = 1; i <= n; i++) {
                if (in[i] == n - 1 && out[i] == 0) {
                    return i;
                }
            }
            return -1;
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.findJudge(2,new int[][]{{1, 2}}));
        System.out.println(solution.findJudge(3, new int[][]{{1, 3}, {2, 3}}));
        System.out.println(solution.findJudge(3, new int[][]{{1, 3}, {2, 3}, {3, 1}}));
    }

}
